package com.weixue.controller.admin;

import com.weixue.common.NongFuMallCategoryLevelEnum;
import com.weixue.common.ServiceResultEnum;
import com.weixue.entity.GoodsCategory;
import com.weixue.service.NongFuMallCategoryService;
import com.weixue.utils.PageQueryUtil;
import com.weixue.utils.Result;
import com.weixue.utils.ResultGenerator;
import org.springframework.stereotype.Controller;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.*;

@Controller
@RequestMapping("/admin")
public class NongFuMallGoodsCategoryController {

    @Resource
    private NongFuMallCategoryService nongFuMallCategoryService;

    /**
     * Day25
     *      分类管理页面跳转到nongfu_mall_category.html
     *          ①parentId：父级分类id
     *          ②categoryLevel：分类级别
     *          ③backParentId：返回上一级分类所需的父级分类id
     *      在当前系统中默认先显示一级分类的列表
     */
    @GetMapping("/categories")
    public String categoriesPage(HttpServletRequest request,
                                 @RequestParam("categoryLevel") Byte categoryLevel,
                                 @RequestParam("parentId") Long parentId,
                                 @RequestParam("backParentId") Long backParentId) {
        if (categoryLevel == null || categoryLevel < 1 || categoryLevel > 3) {
            return "error/error_5xx";
        }
        request.setAttribute("path", "nongfu_mall_category");
        request.setAttribute("parentId", parentId);
        request.setAttribute("backParentId", backParentId);
        request.setAttribute("categoryLevel", categoryLevel);
        return "/admin/nongfu_mall_category";
    }

    /**
     * Day24
     *      列表接口
     *          负责接收前端传来的分页参数，比如page、limit等参数。
     *          由于分类层级的设计，系统在获取分类列表时会分别获取对应层级的商品类目数据。
     *          在传参时需要将类目的层级categoryLevel和父级类目的id也带上，
     *          最后将数据总数和对应页面的数据列表查询出来并封装为分页数据返回给前端
     */
    @RequestMapping(value = "/categories/list", method = RequestMethod.GET)
    @ResponseBody
    public Result list(@RequestParam Map<String, Object> params) {
        if (StringUtils.isEmpty(params.get("page"))
                || StringUtils.isEmpty(params.get("limit"))
                || StringUtils.isEmpty(params.get("categoryLevel"))
                || StringUtils.isEmpty(params.get("parentId"))) {
            return ResultGenerator.genFailResult("参数异常！");
        }
        PageQueryUtil pageUtil = new PageQueryUtil(params);
        return ResultGenerator.genSuccessResult(nongFuMallCategoryService.getCategorisPage(pageUtil));
    }

    /**
     * Day24
     *      添加接口
     *          负责接收前端的POST请求并处理其中的参数
     *              - 类目级别：categoryLevel字段
     *              - 类目的父级id：parentId字段
     *              - 类目名称：categoryName字段
     *              - 排序值：categoryRank字段
     *
     *      使用@RequestBody注解将参数转换为GoodsCategory对象参数。
     *      在代码实现中，首先会对参数进行校验，然后交给业务层代码进行数据封装并进行数据库insert操作。
     *      在业务层代码中也有一个逻辑验证，即如果已经存在同级且同名的分类数据就不再继续添加。
     */
    @RequestMapping(value = "/categories/save", method = RequestMethod.POST)
    @ResponseBody
    public Result save(@RequestBody GoodsCategory goodsCategory) {
        if (Objects.isNull(goodsCategory.getCategoryLevel())
                || StringUtils.isEmpty(goodsCategory.getCategoryName())
                || Objects.isNull(goodsCategory.getParentId())
                || Objects.isNull(goodsCategory.getCategoryRank())) {
            return ResultGenerator.genFailResult("参数异常！");
        }
        String result = nongFuMallCategoryService.saveCategory(goodsCategory);
        if (ServiceResultEnum.SUCCESS.getResult().equals(result)) {
            return ResultGenerator.genSuccessResult();
        } else {
            return ResultGenerator.genFailResult(result);
        }
    }

    /**
     * Day24
     *      修改接口
     *          与添加接口类似，只是接受的参数多了一个
     *              - 类目id：categoryId字段
     *              - 类目级别：categoryLevel字段
     *              - 类目的父级id：parentId字段
     *              - 类目名称：categoryName字段
     *              - 排序值：categoryRank字段
     *
     *      在这个方法里依然使用@RequestBody注解将参数转换为GoodsCategory对象参数。
     *      在商品类目修改接口中，依然会对传递过来的5个参数进行基本的校验，然后交给业务层代码处理。这里需要进行两个判断。
     *              - 根据id查询在数据库中的记录判断，如果没有则表示前端传递过来的数据有问题，返回错误信息
     *              - 查询是否有同名的类目，如果有则返回错误信息
     */
    @RequestMapping(value = "/categories/update", method = RequestMethod.POST)
    @ResponseBody
    public Result update(@RequestBody GoodsCategory goodsCategory) {
        if (Objects.isNull(goodsCategory.getCategoryId())
                || Objects.isNull(goodsCategory.getCategoryLevel())
                || StringUtils.isEmpty(goodsCategory.getCategoryName())
                || Objects.isNull(goodsCategory.getParentId())
                || Objects.isNull(goodsCategory.getCategoryRank())) {
            return ResultGenerator.genFailResult("参数异常！");
        }
        String result = nongFuMallCategoryService.updateGoodsCategory(goodsCategory);
        if (ServiceResultEnum.SUCCESS.getResult().equals(result)) {
            return ResultGenerator.genSuccessResult();
        } else {
            return ResultGenerator.genFailResult(result);
        }
    }

    /**
     * Day24
     *      分类删除
     *          该接口的参数是一个数组，可以同时删除多条商品类目记录。
     *          并使用@RequestBody注解将前端传过来的参数封装为数组对象。如果数组为空则直接返回异常提醒。
     *          在参数验证通过后则调用deleteBatch()批量删除方法进行数据库操作，否则向前端返回错误信息。
     *          这里执行的SQL语句为update语句，将对应记录的is_deleted字段值设置为1即表示已经删除。
     */
    @RequestMapping(value = "/categories/delete", method = RequestMethod.POST)
    @ResponseBody
    public Result delete(@RequestBody Integer[] ids) {
        if (ids.length < 1) {
            return ResultGenerator.genFailResult("参数异常！");
        }
        if (nongFuMallCategoryService.deleteBatch(ids)) {
            return ResultGenerator.genSuccessResult();
        } else {
            return ResultGenerator.genFailResult("删除失败");
        }
    }

    /**
     * 详情
     */
    @GetMapping("/categories/info/{id}")
    @ResponseBody
    public Result info(@PathVariable("id") Long id) {
        GoodsCategory goodsCategory = nongFuMallCategoryService.getGoodsCategoryById(id);
        if (goodsCategory == null) {
            return ResultGenerator.genFailResult("未查询到数据");
        }
        return ResultGenerator.genSuccessResult(goodsCategory);
    }

    /**
     * 列表
     */
    @RequestMapping(value = "/categories/listForSelect", method = RequestMethod.GET)
    @ResponseBody
    public Result listForSelect(@RequestParam("categoryId") Long categoryId) {
        if (categoryId == null || categoryId < 1) {
            return ResultGenerator.genFailResult("缺少参数！");
        }
        GoodsCategory category = nongFuMallCategoryService.getGoodsCategoryById(categoryId);
        //既不是一级分类也不是二级分类则为不返回数据
        if (category == null || category.getCategoryLevel()
                == NongFuMallCategoryLevelEnum.LEVEL_THREE.getLevel()) {
            return ResultGenerator.genFailResult("参数异常！");
        }
        Map categoryResult = new HashMap(2);
        if (category.getCategoryLevel() == NongFuMallCategoryLevelEnum.LEVEL_ONE.getLevel()) {
            //如果是一级分类则返回当前一级分类下的所有二级分类，以及二级分类列表中第一条数据下的所有三级分类列表
            //查询一级分类列表中第一个实体的所有二级分类
            List<GoodsCategory> secondLevelCategories
                    = nongFuMallCategoryService.selectByLevelAndParentIdsAndNumber
                    (Collections.singletonList(categoryId), NongFuMallCategoryLevelEnum.LEVEL_TWO.getLevel());
            if (!CollectionUtils.isEmpty(secondLevelCategories)) {
                //查询二级分类列表中第一个实体的所有三级分类
                List<GoodsCategory> thirdLevelCategories
                        = nongFuMallCategoryService.selectByLevelAndParentIdsAndNumber
                        (Collections.singletonList(secondLevelCategories.get(0).getCategoryId()), NongFuMallCategoryLevelEnum.LEVEL_THREE.getLevel());
                categoryResult.put("secondLevelCategories", secondLevelCategories);
                categoryResult.put("thirdLevelCategories", thirdLevelCategories);
            }
        }
        if (category.getCategoryLevel() == NongFuMallCategoryLevelEnum.LEVEL_TWO.getLevel()) {
            //如果是二级分类则返回当前分类下的所有三级分类列表
            List<GoodsCategory> thirdLevelCategories
                    = nongFuMallCategoryService.selectByLevelAndParentIdsAndNumber
                    (Collections.singletonList(categoryId), NongFuMallCategoryLevelEnum.LEVEL_THREE.getLevel());
            categoryResult.put("thirdLevelCategories", thirdLevelCategories);
        }
        return ResultGenerator.genSuccessResult(categoryResult);
    }
}